さあ、スクリプト解説第一弾として、まずは画面の初期化とメインルーチンを含む自機の表示・移動方法と自機弾の表示・移動方法を説明いたします♪
まず1行目でスクリプトを見やすく・分かりやすくする為に、よく使う『SHOTMAX』と言うマクロを定義します。(あくまでも分かりやすくする為ですので、『SHOTMAX=2』の様に変数扱いとしても同様の結果になります)
2〜6行目でバッファに画像を読み込んで実際に表示する画面の初期化を行っています。
『*SYOKIKA』の部分では自機の初期位置と自機弾の準備を行います。自機弾についてですが、一度に2発までを画面に表示出来るようにしている為、同一の変数名で複数の値を格納出来る配列変数を使用します。
さあ、いよいよ『*MAIN』メインルーチンです。簡単に言っちゃうと画面非表示状態でメイン画面と同じ大きさの黒いBOXで全体を塗りつぶした後にサブルーチン『*JIKI』と『*TAMA』に飛んで自機と弾を描画、その後画面を切り替えて一気に表示・・・ってな感じです。
※注意
このメインループの様に無限ループに陥る場所においては、必ず『wait』や『await』命令を使用して、Windowsにタスクを回す必要があります。これをしないとWindowsのほぼ全てのタスクが消費されてウィンドウを閉じる事すら出来なくなってしまいますよ☆
さあ、『*JIKI』ココからが今回のメイン。
まず『stick』命令で矢印キーの左(1)・右(4)が押された場合(合計5)は非トリガータイプのキーにします。また、スペースキー(16)が押された場合(3回に1回の割合で)弾が発射されたフラッグ『ff=1』を立てます。ちなみに『k-:if
k<1』〜『k=3』この部分を削除すると連射になりますよ。
次の2行で左右のキーが押された時の移動量を計算しています。ここは、こういうものだと思って下さい(^^);
次の2行は自機が画面外に出ないようにする為の処理です。単純だけど一番確実な方法ですよ♪
最後に新しいポジションに自機を描画します。
さて、最後に『*TAMA』自機弾の表示と移動です。
まず、弾は複数(今回は2発)存在するので『repeat〜loop』を使用して表示する弾の数だけループさせます。
次に、もし弾が発射されたフラッグが立っていて『ff>0』尚且つ弾が存在しなければ『sf.cnt=0』弾を発射します。
次に『if
sf.cnt=0 : continue』ですが、これはもし弾が画面上から消えたら(存在しなければ)その後の移動処理を飛ばす・・・ってな意味です。
次に一定速度で弾を移動した後、もし弾が画面上部から消えたら『if
sy.cnt<-32』弾の存在を消します『sf.cnt=0』
最後に新しいポジションに自機弾を描画します。
ざっと説明しましたが、お分かりいただけましたか!?
下記のスクリプトの一部または全部において転用は自由とさせていただきますので、色々と数字を換えてお試し下さい♪
下記スクリプトをHSPのスクリプトエディターにコピペでお使いいただけます。
|
#define SHOTMAX 2 ;自機弾最大数
buffer 2,,,1
picload "cruiser.bmp"
screen 0,640,480,1,dispx-640/2,dispy-480/2:cls 4 : title "space cruiser"
font "MS 明朝",20
gmode 2
*SYOKIKA
mx=300 : my=400 ;自機の初期位置
dim sf,SHOTMAX ;自弾の有無
dim sx,SHOTMAX ;自弾のX座標
dim sy,SHOTMAX ;自弾のY座標
*MAIN ;メインループ
palcolor 0 : boxf 0,0,640,480
gosub *JIKI
gosub *TAMA
redraw 1 : redraw 2 : await 30
goto *MAIN
*JIKI ;自機の移動・ショットキーチェック
stick bt,5 : k- : if k<1 : if bt&16 : ff=1 : k=3
mxv=(bt&4!0):mxv-=(bt&1!0)
mx+=mxv*8
if mx<0 : mx=0
if mx>580 : mx=580
pos mx,my : gcopy 2,0,32,64,64
return
*TAMA ;自機弾の移動・表示
repeat SHOTMAX
if ff>0 : if sf.cnt=0 : ff- : sf.cnt=1 : sx.cnt=mx+16 : sy.cnt=my-20
if sf.cnt=0 : continue
sy.cnt-=12 : if sy.cnt<-32 : sf.cnt=0
pos sx.cnt,sy.cnt : gcopy 2,96,0,32,32
loop
return
|
|
 ↑こんな感じです。左右の移動と弾を撃つだけね☆
|
上手く出来たら、次に行ってみましょう♪
NEXT ->>
|